console_start_sync();
show_registers(regs);
- printk("dar 0x%016lx, dsisr 0x%08x\n", mfdar(), mfdsisr());
printk("hid4 0x%016lx\n", regs->hid4);
printk("---[ backtrace ]---\n");
show_backtrace(regs->gprs[1], regs->lr, regs->pc);
OFFSET(UREGS_ctr, struct cpu_user_regs, ctr);
OFFSET(UREGS_xer, struct cpu_user_regs, xer);
OFFSET(UREGS_hid4, struct cpu_user_regs, hid4);
+ OFFSET(UREGS_dar, struct cpu_user_regs, dar);
+ OFFSET(UREGS_dsisr, struct cpu_user_regs, dsisr);
OFFSET(UREGS_cr, struct cpu_user_regs, cr);
OFFSET(UREGS_fpscr, struct cpu_user_regs, fpscr);
DEFINE(UREGS_sizeof, sizeof(struct cpu_user_regs));
* a better way, but this works for now. */
ex_program_continued:
SAVE_GPRS r14, r31, r1 /* save all the non-volatiles */
- /* save hid4 for debug */
+
+ /* save these for debug, no needed for restore */
mfspr r14, SPRN_HID4
std r14, UREGS_hid4(r1)
+ mfdar r14
+ std r14, UREGS_dar(r1)
+ mfdsisr r14
+ stw r14, UREGS_dsisr(r1)
+
mr r14, r0
EXCEPTION_SAVE_STATE r1
mr r4, r14
regs->pc, regs->msr,
regs->lr, regs->ctr,
regs->srr0, regs->srr1);
- for (i=0; i<32; i+=4) {
+
+ /* These come in handy for debugging but are not always saved, so
+ * what is "actually" in the register should be good */
+ printk("dar %016lx dsisr %08x *** saved\n"
+ "dar %016lx dsisr %08x *** actual\n",
+ regs->dar, regs->dsisr,
+ mfdar(), mfdsisr());
+
+ for (i = 0; i < 32; i += 4) {
printk("r%02i: %016lx %016lx %016lx %016lx\n", i,
regs->gprs[i], regs->gprs[i+1], regs->gprs[i+2], regs->gprs[i+3]);
}
typedef uint64_t xen_ulong_t;
-/* User-accessible registers: need to be saved/restored for every nested Xen
- * invocation. */
+/* User-accessible registers: nost of these need to be saved/restored
+ * for every nested Xen invocation. */
struct cpu_user_regs
{
uint64_t gprs[32];
uint64_t srr1;
uint64_t pc;
uint64_t msr;
- uint64_t fpscr;
+ uint64_t fpscr; /* XXX Is this necessary */
uint64_t xer;
- uint64_t hid4;
+ uint64_t hid4; /* debug only */
+ uint64_t dar; /* debug only */
+ uint32_t dsisr; /* debug only */
uint32_t cr;
+ uint32_t __pad; /* good spot for another 32bit reg */
uint32_t entry_vector;
};
typedef struct cpu_user_regs cpu_user_regs_t;